package com.example.springboottest.example.jdk11;
//
//import com.fasterxml.jackson.databind.ObjectMapper;
//
//import java.io.IOException;
//import java.net.URI;
//import java.net.http.HttpClient;
//import java.net.http.HttpRequest;
//import java.net.http.HttpResponse;
//import java.util.HashMap;
//import java.util.Map;
//import java.util.concurrent.CompletableFuture;
//
///**
// * 参考文档
// * https://my.oschina.net/mdxlcj/blog/3010342
// */
public class Jdk11Test {
    public static void main(String[] args) {

        // \u000d System.out.println("hello world");
//        //1、增强局部变量类型推断var
//        var javastack = "javastack";
//        System.out.println(javastack);
//
//        //2、增加一些实用的API
//        var str = "woshidage";
//        boolean isblank = str.isBlank();  //判断字符串是空白
//        boolean isempty = str.isEmpty();  //判断字符串是否为空
//        String result1 = str.strip();    //首位空白
//        String result2 = str.stripTrailing();  //去除尾部空白
//        String result3 = str.stripLeading();  //去除首部空白
//        String copyStr = str.repeat(2);  //复制几遍字符串
//        long lineCount = str.lines().count();  //行数统计
//
//        System.out.println(isblank);
//        System.out.println(isempty);
//        System.out.println(result1);
//        System.out.println(result2);
//        System.out.println(result3);
//        System.out.println(copyStr);
//        System.out.println(lineCount);
//
//
//        //4、HttpClient加强方法
//        //现在 Java 自带了这个 HTTP Client API，我们以后还有必要用 Apache 的 HttpClient 工具包吗？
//        //同步调用
//        HttpClient client = HttpClient.newHttpClient();
//        String requestBody = "{\"pageInfo\":{\"pageSize\":50,\"beginIndex\":0}}";
//        HttpRequest request = HttpRequest.newBuilder(URI.create("http://fbomtest.faw.cn/custColor/find")).
//                header("Content-Type", "application/json").
//                POST(HttpRequest.BodyPublishers.ofString(requestBody)).build();
//
//
//        HttpResponse.BodyHandler<String> handler = HttpResponse.BodyHandlers.ofString();
//        HttpResponse<String> response = null;
////        CompletableFuture<HttpResponse<String>> response = null;
//        try {
//            response = client.send(request, handler);
//            //异步调用
////            response = client.sendAsync(request,handler);
//        } catch (IOException e) {
//            e.printStackTrace();
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }
//        String body = response.body();
//        System.out.println(body);
//
//        //10 ZGC, 这应该是JDK11最为瞩目的特性, 没有之一. 但是后面带了Experimental, 说明这还不建议用到生产环境。
//        //    GC暂停时间不会超过10ms，既能处理几百兆的小堆, 也能处理几个T的大堆(OMG)，和G1相比, 应用吞吐能力不会下降超过15%，为未来的GC功能和利用colord指针以及Load barriers优化奠定基础，初始只支持64位系统
//        //    ZGC的设计目标是：支持TB级内存容量，暂停时间低（<10ms），对整个程序吞吐量的影响小于15%。 将来还可以扩展实现机制，以支持不少令人兴奋的功能，例如多层堆（即热对象置于DRAM和冷对象置于NVMe闪存），或压缩堆。
//        //    GC是java主要优势之一，当GC停顿太长, 就会开始影响应用的响应时间.消除或者减少GC停顿时长, java将对更广泛的应用场景是一个更有吸引力的平台. 此外, 现代系统中可用内存不断增长,用户和程序员希望JVM能够以高效的方式充分利用这些内存, 并且无需长时间的GC暂停时间
//        //用法 : -XX:+UnlockExperimentalVMOptions –XX:+UseZGC, 因为ZGC还处于实验阶段, 所以需要通过JVM参数来解锁这个特性
//
//        /**
//         * 11、完全支持Linux容器（包括Docker）
//         *       许多运行在Java虚拟机中的应用程序（包括Apache Spark和Kafka等数据服务以及传统的企业应用程序）都可以在Docker容器中运行。
//         *       但是在Docker容器中运行Java应用程序一直存在一个问题，那就是在容器中运行JVM程序在设置内存大小和CPU使用率后，
//         *       会导致应用程序的性能下降。这是因为Java应用程序没有意识到它正在容器中运行。
//         *       随着Java 10的发布，这个问题总算得以解决，JVM现在可以识别由容器控制组（cgroups）设置的约束。
//         *       可以在容器中使用内存和CPU约束来直接管理Java应用程序，其中包括：
//         *       遵守容器中设置的内存限制
//         *
//         *      在容器中设置可用的CPU
//         *
//         *      在容器中设置CPU约束
//         *
//         * Java 10的这个改进在Docker for Mac、Docker for Windows以及Docker Enterprise Edition等环境均有效。
//         *
//         * 容器的内存限制
//         *
//         * 在Java 9之前，JVM无法识别容器使用标志设置的内存限制和CPU限制。而在Java 10中，内存限制会自动被识别并强制执行。Java将服务器类机定义为具有2个CPU和2GB内存，以及默认堆大小为物理内存的1/4。
//         */
//
//        /*
//        12、支持G1上的并行完全垃圾收集
//      对于 G1 GC，相比于 JDK 8，升级到 JDK 11 即可免费享受到：并行的 Full GC，快速的 CardTable 扫描，自适应的堆占用比例调整（IHOP），在并发标记阶段的类型卸载等等。这些都是针对 G1 的不断增强，其中串行 Full GC 等甚至是曾经被广泛诟病的短板，你会发现 GC 配置和调优在 JDK11 中越来越方便。
//         */
    }
}
